package com.villaday.idf.base.broadcast;

import java.util.HashMap;
import java.util.Map;

import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;

/**
 * 用于管理单个presenter的RxBus的事件和RxJava相关代码的生命周期处理
 */
public class RxManager {
    public RxBus mRxBus=RxBus.getInstance();
    //管理rxbus订阅
    private Map<String, Observable<?>> mObservables=new HashMap<>();
    //管理Observables和Subscribers订阅
    private CompositeDisposable mCompositeDisposable=new CompositeDisposable();
    /**
     * RxBus注入监听
     */
    public <T> void on(String eventName, Consumer<T> action1){
        Observable<T> mObservable=mRxBus.register(eventName);
        mObservables.put(eventName,mObservable);
        Disposable subscription=mObservable.observeOn(AndroidSchedulers.mainThread())
                .subscribe(action1, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        throwable.printStackTrace();
                    }
                });
        //订阅管理
        mCompositeDisposable.add(subscription);
    }

    /**
     * 单纯的Observables 和 Subscribers管理
     */
    public void add(Disposable m){
        //订阅管理
        mCompositeDisposable.add(m);
    }

    /**
     * 单个presenter生命周期结束，取消订阅和所有rxbus观察
     */
    public void clear(){
        mCompositeDisposable.dispose();
        for (Map.Entry<String,Observable<?>> entry:mObservables.entrySet()){
            mRxBus.unregister(entry.getKey(),entry.getValue());// 移除rxbus观察
        }
    }

    public void unregister(String tag){
        Observable<?> observable=mObservables.remove(tag);
        if (observable!=null){
            mRxBus.unregister(tag,observable);//移除rxbus观察
        }
    }

    //发送rxbus
    public void post(Object tag,Object content){
        mRxBus.post(tag,content);
    }
}
